from PIL import Image
from io import BytesIO
from django.core.files.base import ContentFile
import os

def compress_image(image_file, quality=85, max_width=1920, max_height=1080):
    """
    压缩图片
    :param image_file: 上传的图片文件
    :param quality: 压缩质量 (1-100)
    :param max_width: 最大宽度
    :param max_height: 最大高度
    :return: 压缩后的图片文件
    """
    try:
        # 打开图片
        img = Image.open(image_file)
        
        # 转换为RGB模式（处理透明背景）
        if img.mode in ("RGBA", "P"):
            img = img.convert("RGB")
        
        # 获取原始尺寸
        width, height = img.size
        
        # 计算新尺寸（保持宽高比）
        if width > max_width or height > max_height:
            ratio = min(max_width / width, max_height / height)
            new_width = int(width * ratio)
            new_height = int(height * ratio)
            img = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
        
        # 压缩图片
        output = BytesIO()
        img.save(output, format='JPEG', quality=quality, optimize=True)
        output.seek(0)
        
        # 生成新的文件名
        name, ext = os.path.splitext(image_file.name)
        new_name = f"{name}_compressed.jpg"
        
        return ContentFile(output.read(), name=new_name)
        
    except Exception as e:
        # 如果处理失败，返回原文件
        return image_file

def create_thumbnail(image_file, size=(300, 300)):
    """
    创建缩略图
    :param image_file: 上传的图片文件
    :param size: 缩略图尺寸 (width, height)
    :return: 缩略图文件
    """
    try:
        img = Image.open(image_file)
        
        if img.mode in ("RGBA", "P"):
            img = img.convert("RGB")
        
        # 创建缩略图（保持宽高比，居中裁剪）
        img.thumbnail(size, Image.Resampling.LANCZOS)
        
        # 创建一个指定尺寸的白色背景
        background = Image.new('RGB', size, (255, 255, 255))
        
        # 计算居中位置
        offset = ((size[0] - img.size[0]) // 2, (size[1] - img.size[1]) // 2)
        
        # 将缩略图粘贴到白色背景上
        background.paste(img, offset)
        
        output = BytesIO()
        background.save(output, format='JPEG', quality=85)
        output.seek(0)
        
        name, ext = os.path.splitext(image_file.name)
        new_name = f"{name}_thumb.jpg"
        
        return ContentFile(output.read(), name=new_name)
        
    except Exception as e:
        return None